package com.zxy.demo.java.reflect;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * PersonCglibProxy.
 *
 * Created by zxybird on 2017/12/7.
 */
public class PersonCglibProxy {

  public static Person getInstance() {
    Person person = new Person();

    person.setName("zxy");
    person.setAge(27);

    // 在内存中创建一个动态类的字节码
    Enhancer enhancer = new Enhancer();
    // 为其指定父类
    // 除了完成继承关系外，还将父类所有的方法名反射过来，并在自己的类中
    // 创建了这些方法
    enhancer.setSuperclass(Person.class);
    // 回调方法的参数为代理类对象CglibProxy，最后增强目标类调用的是代理类对象CglibProxy中的intercept方法
    enhancer.setCallback(new MethodInterceptor() {

      private Person person;

      public MethodInterceptor setObject(Person person) {
        this.person = person;
        return this;
      }

      @Override
      public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        if ("getAge".equals(method.getName())) {
          return null;
        }
        return method.invoke(person, objects);
      }
    }.setObject(person));
    // 此刻，base不是单纯的目标类，而是增强过的目标类
    // 使用该类创建对象
    return (Person) enhancer.create();
  }

  public static void main(String[] args) {
    Person person = getInstance();
    System.out.println(person.getName());
    System.out.println(person.getAge());
  }
}
